home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / UTIL / Acme Filters 2.3.2 folder.sit / Acme Filters 2.3.2 folder / Acme Filters 2.3.2 / Acme Filters オ / Sources / TypeCreator.c < prev   
Text File  |  1996-02-03  |  5KB  |  188 lines

  1. /************ I N C L U D E   F I L E S *******************************************************/
  2.  
  3. #include <stdio.h>
  4.  
  5. #include "Acme Filters.h"
  6. #include "TypeCreator.h"
  7.  
  8.  
  9.  
  10. /**********************************************************************************************
  11.  * Function Name:  TypeCreator
  12.  *
  13.  * Description:    Set a file's type and creator codes.
  14.  *
  15.  * Parameters:     iFile - file spec of a file.
  16.  *                 type - the selected file type.
  17.  *                 creator - the selected file creator.
  18.  *
  19.  * Return Value:   None.
  20.  **********************************************************************************************/
  21. void    TypeCreator( FSSpec *iFile, OSType type, OSType creator )
  22. {
  23.     FInfo    iInfo;
  24.     
  25.     gCancelReq |= Cancel();
  26.     ScrollIcon();
  27.     
  28.     FSpGetFInfo( iFile, &iInfo );
  29.     iInfo.fdType = type;
  30.     iInfo.fdCreator = creator;
  31.     FSpSetFInfo( iFile, &iInfo );
  32.     
  33.     TickleParentDir( iFile );
  34. }
  35.  
  36.  
  37.  
  38. /**********************************************************************************************
  39.  * Function Name:  PickTypeCreator
  40.  *
  41.  * Description:    View or specify a file's type and creator codes.
  42.  *
  43.  * Parameters:     file - the file.
  44.  *                 selType - the selected file type.
  45.  *                 selCrea - the selected file creator.
  46.  *
  47.  * Return Value:   noErr if ok, error code otherwise.
  48.  **********************************************************************************************/
  49. OSErr    PickTypeCreator( FSSpec *file, OSType *selType, OSType *selCrea )
  50. {
  51.     OSErr            err = noErr;
  52.     DialogPtr        picker;
  53.     WindowPtr        saveMe;
  54.     Boolean            done = false;
  55.     short            item;
  56.     ModalFilterUPP    filter = NewModalFilterProc( PickTypeCreatorDlgFltr );
  57.     
  58.     FInfo            info;
  59.     short            iType;
  60.     Handle            iHandle;
  61.     Rect            iRect;
  62.     Str255            str;
  63.     OSType            *cp = (OSType *)&str[1];
  64.     
  65.     if ( picker = GetNewDialog( kTypeCreaDlog, nil, (WindowPtr)-1L ) )
  66.     {
  67.         // stuff the type and creator into the two TE fields
  68.         FSpGetFInfo( file, &info );
  69.         GetDItem( picker, kTEType, &iType, &iHandle, &iRect );
  70.         str[0] = 4;
  71.         *cp = info.fdType;
  72.         SetIText( iHandle, str );
  73.         GetDItem( picker, kTECreator, &iType, &iHandle, &iRect );
  74.         str[0] = 4;
  75.         *cp = info.fdCreator;
  76.         SetIText( iHandle, str );
  77.         SelIText( picker, kTEType, 0, 4 );
  78.         
  79.         GetPort( &saveMe );
  80.         SetPort( picker );
  81.         ShowWindow( picker );
  82.         
  83.         while ( !done )
  84.         {
  85.             ModalDialog( filter, &item );
  86.             switch( item )
  87.             {
  88.                 case -1:            // -1 + 1 =  0, ok
  89.                 case -2:            // -2 + 1 = -1, cancel
  90.                     err = item + 1;
  91.                     done = true;
  92.                     break;
  93.                 
  94.                 case kTEType:
  95.                 case kTECreator:
  96.                     GetDItem( picker, item, &iType, &iHandle, &iRect );
  97.                     GetIText( iHandle, str );
  98.                     if ( str[0] > 4 )
  99.                     {
  100.                         str[0] = 4;
  101.                         SetIText( iHandle, str );
  102.                         SysBeep( 1 );
  103.                     }
  104.                     break;
  105.             }
  106.         }
  107.         
  108.         // retrieve the type and creator from the two TE fields
  109.         GetDItem( picker, kTEType, &iType, &iHandle, &iRect );
  110.         GetIText( iHandle, str );
  111.         *selType = *cp;
  112.         GetDItem( picker, kTECreator, &iType, &iHandle, &iRect );
  113.         GetIText( iHandle, str );
  114.         *selCrea = *cp;
  115.         
  116.         SetPort( saveMe );    
  117.         DisposDialog( picker );
  118.     }
  119.     
  120.     return ( err );
  121. }
  122.  
  123.  
  124.  
  125. /**********************************************************************************************
  126.  * Function Name:  PickTypeCreatorDlgFltr
  127.  *
  128.  * Description:    Handle mouse and keystrokes.
  129.  *
  130.  * Parameters:     dialog - the dialog being filtered.
  131.  *                 event - the event record being processed.
  132.  *                 item - the item in which the event occured.
  133.  *
  134.  * Return Value:   true - ModalDialog returns immediately and without handling the event.
  135.  *                 false - ModalDialog handles the event normally.
  136.  **********************************************************************************************/
  137. pascal Boolean    PickTypeCreatorDlgFltr( DialogPtr dialog, EventRecord *event, short *item )
  138. {
  139.     char    c;
  140.     Boolean    result = false;
  141.     
  142.     *item = 0;
  143.     if ( (event->what == keyDown) || (event->what == autoKey) )
  144.     {
  145.         c = event->message & charCodeMask;
  146.         
  147.         if ( (c == kEnter) || (c == kReturn) )
  148.         {
  149.             if ( CodeOK( dialog, kTEType ) && CodeOK( dialog, kTECreator ) )
  150.                 *item = -1;
  151.             result = true;
  152.         }
  153.         
  154.         if ( (c == kEscape) || ((event->modifiers & cmdKey) && (c == kPeriod)) )
  155.         {
  156.             *item = -2;
  157.             result = true;
  158.         }
  159.     }
  160.     
  161.     return ( result );
  162. }
  163.  
  164.  
  165.  
  166. /**********************************************************************************************
  167.  * Function Name:  CodeOK
  168.  *
  169.  * Description:    Check if the code consists of exactly four characters.
  170.  *
  171.  * Parameters:     dialog - a dialog.
  172.  *                 item - the text edit item to check.
  173.  *
  174.  * Return Value:   true if ok, false otherwise.
  175.  **********************************************************************************************/
  176. Boolean    CodeOK( DialogPtr dialog, short item )
  177. {
  178.     short    iType;
  179.     Handle    iHandle;
  180.     Rect    iRect;
  181.     Str255    str;
  182.     
  183.     GetDItem( dialog, item, &iType, &iHandle, &iRect );
  184.     GetIText( iHandle, str );
  185.     
  186.     return ( str[0] == 4 );
  187. }
  188.